package cn.wiseda.finance.dao.util.page;

import java.lang.reflect.Field;
import java.sql.ResultSet;
import java.sql.SQLException;

import org.springframework.jdbc.core.simple.ParameterizedRowMapper;

/**
 * 通用的Object包装类(类型问题，依然是个瓶颈，如果有好的解决方案请pm我)
 * 
 * 功能：查询对象类型或对象集合时的通用包装类
 * 
 * @author zdw
 * @param <T>
 * 
 */
public class BeanObjectMapper<T> implements ParameterizedRowMapper<T> {
	private Class<T> clazz;

	public BeanObjectMapper(Class<T> clazz) {
		this.clazz = clazz;
	}

	/**
	 * 重写mapRow方法
	 */
	@Override
	public T mapRow(ResultSet rs, int rowNum) throws SQLException {
		try {
			T obj = clazz.newInstance();
			Field fields[] = obj.getClass().getDeclaredFields();
			for (int i = 0; i < fields.length; i++) {
				Field field = fields[i];
				// 暴力访问
				field.setAccessible(true);
				this.typeMapper(field, obj, rs);
				// 恢复默认
				field.setAccessible(false);
			}
			return obj;
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}

	/**
	 * 数据类型包装器
	 * 
	 * @param field
	 *            目标属性
	 * @param obj
	 *            目标对象
	 * @param rs
	 *            结果集
	 * @throws Exception
	 */
	private void typeMapper(Field field, Object obj, ResultSet rs) throws Exception {
		String type = field.getType().getName();
		if (type.equals("java.lang.String")) {
			field.set(obj, rs.getString(field.getName()));
		} else if (type.equals("int") || type.equals("java.lang.Integer")) {
			field.set(obj, rs.getInt(field.getName()));
		} else if (type.equals("long") || type.equals("java.lang.Long")) {
			field.set(obj, rs.getLong(field.getName()));
		} else if (type.equals("boolean") || type.equals("java.lang.Boolean")) {
			field.set(obj, rs.getBoolean(field.getName()));
		} else if (type.equals("java.util.Date")) {
			field.set(obj, rs.getDate(field.getName()));
		}
	}
}